package plus.xj17520.basic.mysuper;

import plus.xj17520.basic.domain.BaseDomain;
import plus.xj17520.basic.domain.BaseQuery;
import plus.xj17520.basic.util.PageList;
import plus.xj17520.org.domain.Employee;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.entity.Example;

import java.lang.reflect.Field;
import java.util.List;

public interface MyBaseMapper<T extends BaseDomain> extends Mapper<T> {
    //简单的crud mapper都已近给我们实现了

    //这个方法就是获取当前实体类的泛型大的class
    Class<T> getTClass();

    //抽取单个删除
    // 加上default ,该接口可以有默认方法了
    default  void delete(Long id){
        T tClass = null;
        try {
            //这里通过反射得到实体对象
            tClass = getTClass().newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //默认将删除设置为false
        tClass.setDel(Boolean.FALSE);
        tClass.setId(id);
        this.updateByPrimaryKeySelective(tClass);
    };
    //批量删除
    default  void deleteBatch(List<Long> ids){
        T tClass = null;
        try {
            tClass = getTClass().newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //默认将删除设置为false
        tClass.setDel(Boolean.FALSE);;
        //这里创建条件
        Example example = new Example(getTClass());
        //创建条件查询
        example.createCriteria().andIn("id",ids);
        this.updateByExampleSelective(tClass,example);
    };

    /**
     * 只有一个关键字时使用
     * @param baseQuery
     * @return
     */
    default PageList<T> findPage(BaseQuery baseQuery,String KeyWordProp){
        //1.创建分页对象
        PageHelper.startPage(baseQuery.getPage(),baseQuery.getPageSize());
        //根据关键字查询所有
        Example example = new Example(getTClass());
        example.createCriteria()
                .andLike(KeyWordProp,"%"+baseQuery.getKeyword()+"%");
        List<T> ts = this.selectByExample(example);
        PageInfo<T> tPageInfo = new PageInfo<>(ts);
        return  new PageList<>(tPageInfo.getTotal(),tPageInfo.getList());
    }

//    public static void main(String[] args) throws IllegalAccessException {
//        Employee employee = new Employee();
//        employee.setId(1L);
//        employee.setUsername("张三");
//        Class<? extends Employee> aClass = employee.getClass();
//        //这里是获取当前实体的所有字段
//        Field[] fields = aClass.getDeclaredFields();
//        //将字段进行遍历
//        for (Field field : fields) {
//            //暴力破解获取字段
//            field.setAccessible(Boolean.TRUE);
//            //首先获取这个字段的属性名称
//            String name = field.getName();
//            //这里是获取当前对象对应的值
//            Object o = field.get(employee);
//            System.out.println("当前对象的属性名称:"+name);
//            System.out.println("当前对象的属性值:"+o);
//        }
//
//    }

}
